<html>
    <head>
        <title>类型化Blob容器  IBlobContainer<T></title>
    </head>
    <body>
        <script>
            /*
                        四、类型化IBlobContainer 

                                类型化Blob容器是有名称的，无论你是否给它设置名称，它都会自动分配一个唯一的名称。

                                类型化BLOB容器系统是一种在应用程序中"创建"和"管理" 多个容器的方法：

                                        ①、每个容器都单独存储。
                                                这意味着BLOB名称在一个容器中应该是唯一的，并且具有相同名称的两个BLOB可以存在于不同的容器中而不会相互影响。

                                        ②、每个容器都可以单独配置，因此每个容器可以根据你的配置使用不同的存储提供程序。


                                要创建类型化容器，你需要创建一个用 [BlobContainerName] 特性标准简单的类：

                                        using Volo.Abp.BlobStoring;

                                        namespace AbpDemo
                                        {
                                            [BlobContainerName("profile-pictures")]
                                            public class ProfilePictureContainer
                                            {
                                                
                                            }
                                        }

                                如果不使用[BlobContainerName] 特性，ABP使用类的全名 (带有命名空间)，但始终建议使用稳定且即使重命名类也不会更改的容器名称。
                                
                             
                                创建容器类后，你可以为你的容器类注入 IBlobContainer<T>

                                
                                eg:  应用程序服务保存和读取当前用户的个人资料图片

                                        [Authorize] // 授权过滤器
                                        public class ProfileAppService : ApplicationService
                                        {
                                            private readonly IBlobContainer<ProfilePictureContainer> _blobContainer;

                                            public ProfileAppService(IBlobContainer<ProfilePictureContainer> blobContainer)
                                            {
                                                _blobContainer = blobContainer; // 注入ProfilePictureContainer类型的IBlobContainer服务
                                            }

                                            // 保存BLOB对象
                                            public async Task SaveProfilePictureAsync(byte[] bytes)
                                            {
                                                var blobName = CurrentUser.GetId().ToString();
                                                await _blobContainer.SaveAsync(blobName, bytes);
                                            }
                                            
                                            // 读取BLOB对象
                                            public async Task<byte[]> GetProfilePictureAsync()
                                            {
                                                var blobName = CurrentUser.GetId().ToString();

                                                // 通过ProfilePictureContainer容器获取BLOB对象
                                                return await _blobContainer.GetAllBytesOrNullAsync(blobName);
                                            }
                                        }

                                IBlobContainer<T>具有与IBlobContainer相同的方法。

                                在开发“可重用模块”时始终使用"类型化BLOB容器"是一种很好的做法，因此，最终应用程序可以为你的容器配置提供程序，而不影响其他模块的容器。

                    */
        </script>
    </body>
</html>